说明:本shell题目是一个网友在公众号中提问的,正好利用这个每日习题的机会拿出来让大家一起做一做。
给出一个进程PID,打印出该进程下面的子进程以及子进程下面的所有子进程。(只需要考虑子进程的子进程,再往深层次则不考虑)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| #!/bin/bash read -p "please input a pid number: " p ps -elf > /tmp/ps.log is_ppid(){ awk '{print $5}' /tmp/ps.log > /tmp/ps1.log if ! grep -qw "$1" /tmp/ps1.log then echo "PID $1 不是系统进程号,或者它不是父进程" return 1 fi } is_ppid $p if [ $? -eq "1" ] then exit fi print_cpid(){ p=$1 awk -v p1=$p '$5 == p1 {print $4}' /tmp/ps.log |sort -n |uniq >/tmp/p1.log n=`wc -l /tmp/p1.log|awk '{print $1}'` if [ $n -ne 0 ] then echo "PID $p 子进程 pid 如下:" cat /tmp/p1.log else echo "PID $p 没有子进程" fi } print_cpid $p for cp in `cat /tmp/p1.log` do print_cpid $cp done
|
另外,一条命令查询的方法是:pstree -p pid